package edu.csl.study.springboot.common.exception;

import edu.csl.study.springboot.common.kit.StrKit;
import org.apache.commons.lang.exception.ExceptionUtils;

/**
 * 通用提示工具类。常用的提示都使用这个模板。
 * 
 */
public final class TipTools {

	/**
	 * 获取根异常
	 * 
	 * @param e
	 * @param limitLine
	 * @return
	 */
	public static String[] getRootCauseStackTrace(Exception e, int limitLine) {
		String[] rootCauseStackTrace = ExceptionUtils.getRootCauseStackTrace(e);
		String[] result = new String[2];
		StringBuilder builder = new StringBuilder();
		if (rootCauseStackTrace != null && rootCauseStackTrace.length > 0) {
			for (int i = 0; i < rootCauseStackTrace.length; i++) {
				builder.append(rootCauseStackTrace[i] + "\n");
				if (limitLine != -1 && i == limitLine) {
					break;
				}
			}
			result[0]=rootCauseStackTrace[0];
			result[1]=builder.toString();
			
		}
		
		return result;
	}
	/**
	 * 系统未知异常提示
	 *
	 * @param modelDesc
	 * @param e
	 * @return
	 */
	public static String unknowExceptionTipMsg(String modelDesc, Exception e, int limitLine) {
		if (limitLine <= 0) {
			limitLine = 50;
		} else if (limitLine > 100) {
			limitLine = 100;
		}
		String[] rootCauseStackTrace = TipTools.getRootCauseStackTrace(e, limitLine);
		String msg = TipTools.systemError(modelDesc, rootCauseStackTrace[0]);
		return msg;
	}
	
	/**
	 * 抛出业务异常
	 * 
	 * @param message : 注意，如果是信息，必须是完整的提示信息，包括
	 * @param params
	 */
	public static void throwE(String message,String... params) {
		
       throw new BusinessException(extracted(message, params));
	}

	private static String extracted(String message, String... params) {
		return params != null && params.length > 0 ?  String.format(message, params):message;
	}
	
	/**
	 * 获取报错的代码行数
	 * String position = getPosition(Thread.currentThread().getStackTrace());
	 * @param strackTraceArray
	 * @return
	 */
	public static String getPosition(StackTraceElement[] strackTraceArray) {

		String position = "";
		for (StackTraceElement element : strackTraceArray) {
			if (element.getClassName().equals(TipTools.class.getName())
					|| element.getClassName().equals(Thread.class.getName())
					|| element.getClassName().endsWith("Exception")) {
				continue;
			} else {
				position = element.getClassName() + "." + element.getMethodName() + "(" + element.getFileName() + ":"
						+ element.getLineNumber() + ")";

				break;
			}
		}
		return position;
	}

	/**
	 * 必录提示
	 * 
	 * @param message
	 * @return
	 */
	public static String required(String message) {

		return String.format("%s不允许为空！",message);
	}
	/**
	 * %s和%s不允许同时为空！
	 * 
	 * @param field1
	 * @param field2
	 * @return
	 */
	public static String requiredAtLeastOne(String field1,String field2) {

		return String.format("%s和%s不允许同时为空！",field1,field2);
	}
	/**
	 * %s、%s和%s不允许同时为空！
	 * 
	 * @param field1
	 * @param field2
	 * @param field3
	 * @return
	 */
	public static String requiredAtLeastOne(String field1,String field2,String field3) {

		return String.format("%s、%s和%s不允许同时为空！",field1,field2,field3);
	}

	/**
	 * 条件必录：当%s时，%s不允许为空！
	 * 
	 * @param condition
	 * @param message
	 * @return
	 */
	public static String requiredWhen(String condition, String message) {

		return String.format("%s时，%s不允许为空！", condition, message);
	}
	/**
	 * 条件必录：当%s时，%s不允许为空！
	 * 
	 * @param condition
	 * @param message
	 * @return
	 */
	public static String requiredWhen2(String condition, String message) {

		return String.format("当%s时，%s不允许为空！", condition, message);
	}

	/**
	 * 当%s时，%s必须为空！
	 * 
	 * @param condition
	 * @param message
	 * @return
	 */
	public static String mustNullWhen(String condition, String message) {

		return String.format("当%s时，%s必须为空！", condition, message);
	}
	/**
	 * 当%s时，%s必须为零！
	 * 
	 * @param condition
	 * @param message
	 * @return
	 */
	public static String mustZeroWhen(String condition, String message) {

		return String.format("当%s时，%s必须为零！", condition, message);
	}

	/**
	 * %s必须由%s位数字组成！
	 * 
	 * @param field
	 * @param size
	 * @return
	 */
	public static String mustNumber(String field, int size) {

		return String.format("%s必须由%s位数字组成！", field, size + "");
	}

	/**
	 * %s只允许包含数字！
	 * 
	 * @param field
	 * @return
	 */
	public static String mustNumber(String field) {

		return String.format("%s只允许包含数字！", field);
	}
	/**
	 * 当%s时，%s必须选择%s！
	 * 
	 * @param condition
	 * @param field
	 * @param value
	 * @return
	 */
	public static String mustChooseWhen(String condition,String field,String value) {

		return String.format("当%s时，%s必须选择%s！", condition,field,value);
	}
	
	/**
	 * 只有%s时，%s才允许选择%s！
	 * 
	 * @param condition
	 * @param field
	 * @param value
	 * @return
	 */
	public static String allowChooseOnlyWhen(String condition,String field,String value) {

		return String.format("只有%s时，%s才允许选择%s！", condition,field,value);
	}
	/**
	 * 当%s时，%s不允许选择%s！
	 * 
	 * @param condition
	 * @param field
	 * @param value
	 * @return
	 */
	public static String notAllowChooseWhen(String condition,String field,String value) {

		return String.format("当%s时，%s不允许选择%s！", condition,field,value);
	}
	
	/**
	 * %s与%s不匹配！
	 * 
	 * @param field1
	 * @param field2
	 * @return
	 */
	public static String missMatch(String field1,String field2) {

		return String.format("%s与%s不匹配！", field1,field2);
	}
	
	/**
	 * %s与%s不一致！
	 * 
	 * @param field1
	 * @param field2
	 * @return
	 */
	public static String inConsistent(String field1,String field2) {

		return String.format("%s与%s不一致！", field1,field2);
	}
	/**
	 * %s无效！
	 * 
	 * @param field
	 * @return
	 */
	public static String  isInvalid(String field) {

		return String.format("%s无效！", field);
	}
	/**
	 * 请先计算%s！
	 * 
	 * @param someCalculate
	 * @return
	 */
	public static String  calculateFirst(String someCalculate) {

		return String.format("请先计算%s！", someCalculate);
	}
	/**
	 * %s只允许包含汉字、字母、数字、括号、英文-！
	 * 系统中所有的用户名都可以用这个校验
	 * @param field
	 * @return
	 */
	public static String  userNameFormatError(String field) {

		return String.format("%s只允许包含汉字、字母、数字、括号、英文-！", field);
	}
	/**
	 * %s至少录入2个汉字或者4个字母！
	 * 系统中所有的用户名都可以用这个校验
	 * @param field
	 * @return
	 */
	public static String  userNameLengthError(String field) {

		return String.format("%s至少录入2个汉字或者4个字母！", field);
	}
	/**
	 * %s格式不正确！
	 * @param field
	 * @return
	 */
	public static String  formatIncorrect(String field) {

		return String.format("%s格式不正确！", field);
	}
	/**
	 * %s格式不正确！
	 * @param field
	 * @return
	 */
	public static String  formatIncorrect(String field,String correctFormat) {
		
		return String.format("%s格式有误（正确格式如下：%s）！", field,correctFormat);
	}
	/**
	 * %s不正确！
	 * @param field
	 * @return
	 */
	public static String  inCorrect(String field) {

		return String.format("%s不正确！", field);
	}
	/**
	 * %s不允许大于%s！
	 * 
	 * @param field1
	 * @param field2
	 * @return
	 */
	public static String notAllowGreater(String field1,String field2) {

		return String.format("%s不允许大于%s！", field1,field2);
	}
	/**
	 * 当%s时，%s不允许大于%s！
	 * 
	 * @param condition
	 * @param field1
	 * @param field2
	 * @return
	 */
	public static String notAllowGreaterWhen(String condition ,String field1,String field2) {

		return String.format("当%s时，%s不允许大于%s！", field1,field2);
	}
	/**
	 * %s不允许超过%s%s！
	 * %s指单位
	 * @param field
	 * @param number
	 * @param unitName
	 * @return
	 */
	public static String notAllowExceed(String field,int number,String unitName) {

		return String.format("%s不允许超过%s%s！", field,number+"",unitName);
	}
	/**
	 * %s长度为 %s，超过%s规定的%s个字符（每个中文字算2个字符）！
	 * 
	 * @param field
	 * @param currentLength
	 * @param systemName
	 * @param maxSize
	 * @return
	 */
	public static String notAllowExceed(String field,int currentLength,String systemName,int maxSize) {
         
		return String.format("%s长度为 %s，超过%s规定的%s个字符（每个中文字算2个字符）！", field,currentLength +"", StrKit.isEmpty(systemName)? "系统" :systemName,maxSize+"");
	}
	/**
	 * %s不允许选择%s！
	 * 
	 * @param field
	 * @param value
	 * @return
	 */
	public static String notAllowChoose(String field,String value) {

		return String.format("%s不允许选择%s！", field,value);
	}
	/**
	 * %s不允许小于零！
	 * @param field
	 * @return
	 */
	public static String notAllowBelowZero(String field) {

		return String.format("%s不允许小于零！",field);
	}
	/**
	 * %s不允许小于%s！
	 * @param field
	 * @return
	 */
	public static String notAllowSmaller(String field,String value) {

		return String.format("%s不允许小于%s！",field,value);
	}
	/**
	 * 当%s时，%s不允许小于%s！
	 * @param condition
	 * @param field
	 * @param value
	 * @return
	 */
	public static String notAllowSmallerWhen(String condition,String field,String value) {

		return String.format("当%s时，%s不允许小于%s！",condition,field,value);
	}
	/**
	 * %s必须大于零！
	 * @param field
	 * @return
	 */
	public static String mustGreaterThanZero(String field) {

		return String.format("%s必须大于零！",field);
	}
	/**
	 * %s不允许为零！
	 * @param field
	 * @return
	 */
	public static String notAllowZero(String field) {

		return String.format("%s不允许为零！",field);
	}
	
	/**
	 * 当%s时，%s不允许为零！
	 * @param condition
	 * @param field
	 * @return
	 */
	public static String notAllowZeroWhen(String condition,String field) {

		return String.format("当%s时，%s不允许为零！",condition,field);
	}
	/**
	 * %s不允许为零或空！
	 * @param field
	 * @return
	 */
	public static String notAllowNullOrZero(String field) {

		return String.format("%s不允许为零或空！",field);
	}	
	/**
	 * %s必须为零或空！
	 * @param field
	 * @return
	 */
	public static String mustNullOrZero(String field) {

		return String.format("%s必须为零或空！",field);
	}
	/**
	 * 	%s必须晚于%s！
	 * @param field1
	 * @param field2
	 * @return
	 */
	public static String mustAfter(String field1,String field2) {

		return String.format("%s必须晚于%s！",field1,field2);
	}
	/**
	 * 	%s必须早于%s！
	 * @param field1
	 * @param field2
	 * @return
	 */
	public static String mustBefore(String field1,String field2) {

		return String.format("%s必须早于%s！",field1,field2);
	}

	/**
	 * %s不允许晚于%s
	 * @param field1
	 * @param field2
	 * @return
	 */
	public static String notAllowAfter(String field1,String field2) {

		return String.format("%s不允许晚于%s！",field1,field2);
	}
	/**
	 * %s不允许早于%s！
	 * @param field1
	 * @param field2
	 * @return
	 */
	public static String notAllowBefore(String field1,String field2) {

		return String.format("%s不允许早于%s！",field1,field2);
	}
	/**
	 * 请选择%s
	 * @param field
	 * @return
	 */
	public static String pleaseChoose(String field) {

		return String.format("请选择%s！",field);
	}
	/**
	 * %s在系统中不存在！
	 * @param field
	 * @return
	 */
	public static String notExistsInSystem(String field) {

		return String.format("%s在系统中不存在！",field);
	}
	/**
	 * %s在系统中已存在！
	 * @param field
	 * @return
	 */
	public static String alreadyExistsInSystem(String field) {
		
		return String.format("%s在系统中已存在！",field);
	}
	/**
	 * %s在%s中不存在！
	 * @param field
	 * @param where
	 * @return
	 */
	public static String notExists(String field,String where) {

		return String.format("%s在%s中不存在！",field,where);
	}
	/**
	 * %s大小不允许超过%s且小数最多%s位！
	 * @param field
	 * @param maxlength
	 * @param scale
	 * @return
	 */
	public static String floatFormatError(String field,int maxlength,int scale) {

		return String.format("%s大小不允许超过%s且小数最多%s位！",maxlength+"",scale +"");
	}
	/**
	 * %s小数位超限，最多为%s位！
	 * @param field
	 * @param scale
	 * @return
	 */
	public static String  decimalExceedError (String field,int scale) {

		return String.format("%s小数位超限，最多为%s位！",field,scale +"");
	}
	/**
	 * %s必须是整数！
	 * @param field
	 * @return
	 */
	public static String  mustInteger (String field) {

		return String.format("%s必须是整数！",field);
	}
	/**
	 * %s必须等于%s！
	 * @param field
	 * @param value
	 * @return
	 */
	public static String  mustEquals (String field,String value) {

		return String.format("%s必须等于%s！", field,value);
	}
	/**
	 * %s必须小于%s！
	 * @param field
	 * @param value
	 * @return
	 */
	public static String  mustSmaller (String field,String value) {

		return String.format("%s必须小于%s！",field, value);
	}
	
	/**
	 * 数据异常：%s
	 * @param desc
	 * @return
	 */
	public static String  dataError (String desc) {

		return String.format("数据异常：%s",desc);
	}
	/**
	 * 数据异常：%s  请上报IT问题管理系统！
	 * @param desc
	 * @return
	 */
	public static String  dataErrorWithReport (String desc) {

		return String.format("数据异常：%s  请上报IT问题管理系统！",desc);
	}
	/**
	 * %s不允许包含%s！
	 * @param field
	 * @param value
	 * @return
	 */
	public static String  notAllowContain (String field ,String value) {

		return String.format("%s不允许包含%s！",field,value);
	}
	/**
	 * 当%s时，%s必须录入%s！
	 * @param field
	 * @param value
	 * @return
	 */
	public static String  mustInputWhen(String condition,String field ,String value) {

		return String.format("当%s时，%s必须录入%s！",condition,field ,value);
	}
	
	/**
	 * %s失败！原因：%s
	 * @param what
	 * @param failtureReason
	 * @return
	 */
	public static String  failWithReason (String what,String failtureReason ) {

		return String.format("%s失败！原因：%s",what,failtureReason );
	}
	/**
	 * PF0072	%s不在%s（含）-%s（含）范围内！
	 * @param field
	 * @param left
	 * @param right
	 * @return
	 */
	public static String  mustInRange (String field,String left,String right ) {

		return String.format("%s不在%s（含）-%s（含）范围内！",field,left,right);
	}
	/**
	 * PF0070	%s不在%s（不含）-%s（含）范围内！
	 * @param field
	 * @param left
	 * @param right
	 * @return
	 */
	public static String  mustInRange_NO_L (String field,String left,String right ) {

		return String.format("%s不在%s（不含）-%s（含）范围内！",field,left,right);
	}
	/**
	 * %s不在%s（含）-%s（不含）范围内！
	 * @param field
	 * @param left
	 * @param right
	 * @return
	 */
	public static String  mustInRange_NO_R (String field,String left,String right ) {

		return String.format("%s不在%s（含）-%s（不含）范围内！",field,left,right);
	}
	/**
	 * PF0069	%s不在%s（不含）-%s（不含）范围内！
	 * @param field
	 * @param left
	 * @param right
	 * @return
	 */
	public static String  mustInRange_NO_LR (String field,String left,String right ) {

		return String.format("%s不在%s（不含）-%s（不含）范围内！",field,left,right);
	}
	/**
	 * 系统暂不支持%s！
	 * @param desc
	 * @return
	 */
	public static String  systemNotSupport (String desc) {

		return String.format("系统暂不支持%s！",desc);
	}
	/**
	 * 系统只支持%s！
	 * @param desc
	 * @return
	 */
	public static String  systemOnlySupport (String desc) {

		return String.format("系统只支持%s！",desc);
	}
	/**
	 * 您没有%s的查看权限！
	 * @param desc
	 * @return
	 */
	public static String  noPermissionView (String desc) {

		return String.format("您没有%s的查看权限！",desc);
	}
	/**
	 * 您没有%s的操作权限！
	 * @param desc
	 * @return
	 */
	public static String  noPermissionOperate (String desc) {

		return String.format("您没有%s的操作权限！",desc);
	}
	/**
	 * 您没有%s的修改权限！
	 * @param desc
	 * @return
	 */
	public static String  noPermissionUpdate (String desc) {

		return String.format("您没有%s的修改权限！",desc);
	}
	/**
	 * 您没有%s的删除权限！
	 * @param desc
	 * @return
	 */
	public static String  noPermissionDelete (String desc) {

		return String.format("您没有%s的删除权限！",desc);
	}
	/**
	 * 您没有%s的新增权限！
	 * @param desc
	 * @return
	 */
	public static String  noPermissionAdd (String desc) {

		return String.format("您没有%s的新增权限！",desc);
	}
	/**
	 * 您没有%s的使用权限！
	 * @param desc
	 * @return
	 */
	public static String  noPermissionUse (String desc) {

		return String.format("您没有%s的使用权限！",desc);
	}
	/**
	 * %s成功！
	 * @param desc
	 * @return
	 */
	public static String  success (String desc) {

		return String.format("%s成功！",desc);
	}
	/**
	 * %s保存成功！
	 * @param desc
	 * @return
	 */
	public static String  successSave (String desc) {

		return String.format("%s保存成功！",desc);
	}
	/**
	 * %s新增成功！
	 * @param desc
	 * @return
	 */
	public static String  successAdd (String desc) {

		return String.format("%s新增成功！",desc);
	}
	/**
	 * %s修改成功！
	 * @param desc
	 * @return
	 */
	public static String  successModify (String desc) {

		return String.format("%s修改成功！",desc);
	}
	/**
	 * %s更新成功！
	 * @param desc
	 * @return
	 */
	public static String  successUpdate (String desc) {

		return String.format("%s更新成功！",desc);
	}
	/**
	 * %s删除成功！
	 * @param desc
	 * @return
	 */
	public static String  successDelete (String desc) {

		return String.format("%s删除成功！",desc);
	}
	/**
	 * %s失败！
	 * @param desc
	 * @return
	 */
	public static String  failture (String desc) {

		return String.format("%s失败！",desc);
	}
	/**
	 * %s只允许包含字母、数字！
	 * @param field
	 * @return
	 */
	public static String allowOnlyLettersAndNumbers(String field){
		return String.format("%s只允许包含字母、数字！", field);
	}
	/**
	 * %s出现未知异常！异常信息：%s   
	 * @param where
	 * @param errorDesc
	 * @return
	 */
	public static String systemError(String where,String errorDesc){
		return String.format("%s出现未知异常！异常信息：%s！",where, errorDesc);
	}
	/**
	 * 连接%s失败！ 
	 * @param what
	 * @return
	 */
	public static String connectFail(String what){
		return String.format("连接%s失败！",what);
	}
	/**
	 * 连接%s超时（%s秒）！   
	 * @param what
	 * @param seconds
	 * @return
	 */
	public static String connectTimeOut(String what,int seconds){
		return String.format("连接%s超时（%s秒）！",what, seconds+"");
	}
	
	/**
	 * %s响应超时（%s秒）！   
	 * @param what
	 * @param seconds
	 * @return
	 */
	public static String socketTimeOut(String what,int seconds){
		return String.format("%s响应超时（%s秒）！",what, seconds+"");
	}
	/**
	 * %s返回失败信息：%s
	 * @param what
	 * @param message
	 * @return
	 */
	public static String returnFailMsg(String what,String message){
		return String.format("%s返回失败信息：%s",what,message);
	}
	/**
	 * %s返回数据异常：返回报文为空！
	 * @param where
	 * @return
	 */
	public static String returnNoData(String where ){
		return String.format("%s返回数据异常：返回报文为空！",where);
	}
	/**
	 * %s必须由0-9或-或()组成！
	 * @param desc
	 * @return
	 */
	public static String telePhoneRule(String desc ){
		return String.format("%s必须由0-9或-或()组成！",desc);
	}
	/**
	 * %s不符合金额格式（金额格式：最多保留两位小数的数）！
	 * 金额类型校验
	 * @param desc
	 * @return
	 */
	public static String moneyRule(String desc ){
		return String.format("%s不符合金额格式（金额格式：最多保留两位小数的数）！",desc);
	}
	/**
	 * %s返回：%s
	 * @param serverName
	 * @param message
	 * @return
	 */
	public static String platformMsg(String serverName,String message ){
		return String.format("%s返回：%s",serverName,message);
	}
	
	/**
	 * %s只允许包含数字且长度不超过%s位
	 * @param field
	 * @param size
	 * @return
	 */
	public static String mustNumberAndnotAllowExceed(String field, int size){
		return String.format("%s只允许包含数字且长度不超过%s位",field,size);
	}
	
	
}
